﻿
#include "relay.h"

bool is_online;

pcap_t *pcap_a;
pcap_t *pcap_b;

pcap_t *pcap_from;
pcap_t *pcap_to;

char heart_pack_loop[] = {0x9, 0x1, 0xe, 0x6, 0xa, 0x2, 0xc, 0x4, 0x8, 0x0, 0xf, 0x7, 0xb, 0x3, 0xd, 0x5};

void pcap_handle(u_char *user, const struct pcap_pkthdr *h, const u_char *buf)
{
    PcapInfo* info = (PcapInfo*)user;
    printf("%d %x\n", h->len, buf[15]);
    
    // 如果当前网卡是包的发送者，转发给另一张网卡
    // 如果当前网卡不是包的接收者，转发给另一张网卡
    if (memcmp(info->mac_addr, buf, 6) || memcmp(info->mac_addr, buf+6, 6)) {
        // 篡改 MAC 地址
        // ...
        
        // 心跳包
        if (h->len == 45 && buf[15] == 0xbf) {
            //  0-5 位 发送者MAC
            //  6-11位 接受者MAC
            // 12 13位 0x888E
            //    14位 01
            //    15位 0xBF
            
            // 心跳包是一个可靠的在线标志
            if (!is_online) is_online = true;
            pcap_sendpacket(pcap_to, buf, h->len);
        } else {
            // 若不在线，转发数据，在线的话就不管了
            //if (!is_online)
                pcap_sendpacket(pcap_to, buf, h->len);
        }
    }
}

int rpcap_open(PcapInfo info, pcap_t*& pcap)
{
    char buf[PCAP_ERRBUF_SIZE];

    if ((pcap = pcap_open_live(info.name.c_str(), 2048, 1, 1000, buf)) == NULL) {
        printf("!! 打开网卡%s失败: %s\n", info.desc.c_str(), buf);
        return -1;
    }

    return 0;
}

void rpcap_loop(PcapInfo* info, pcap_t *pcap)
{
    struct bpf_program filter;
    pcap_compile(pcap, &filter, "ether proto 0x888E", 1, 0);
    pcap_setfilter(pcap, &filter);

    pcap_loop(pcap, -1, pcap_handle, (u_char*)info);
    pcap_close(pcap);
}
